/**
 * 邮件通知服务类 - 处理天文事件的邮件提醒功能
 * 注意：实际发送邮件需要后端服务器支持
 */
class EmailNotificationService {
  constructor() {
    this.userEmail = this.loadUserEmail();
    this.emailPreferences = this.loadEmailPreferences();
    this.apiBaseUrl = '/api/email'; // 假设后端API地址
  }

  /**
   * 保存用户邮箱
   * @param {string} email 用户邮箱地址
   */
  saveUserEmail(email) {
    try {
      this.userEmail = email;
      localStorage.setItem('userEmail', email);
      return true;
    } catch (error) {
      console.error('保存邮箱失败:', error);
      return false;
    }
  }

  /**
   * 从本地存储加载用户邮箱
   * @returns {string|null} 用户邮箱或null
   */
  loadUserEmail() {
    try {
      return localStorage.getItem('userEmail') || null;
    } catch (error) {
      console.error('加载邮箱失败:', error);
      return null;
    }
  }

  /**
   * 验证邮箱格式
   * @param {string} email 邮箱地址
   * @returns {boolean} 是否为有效邮箱
   */
  validateEmail(email) {
    const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return re.test(email);
  }

  /**
   * 保存邮件提醒偏好设置
   * @param {Object} preferences 偏好设置对象
   */
  saveEmailPreferences(preferences) {
    try {
      this.emailPreferences = {
        enabled: true,
        reminderFrequency: 'daily', // 'immediate', 'daily', 'weekly'
        eventTypes: ['meteorShower', 'eclipse', 'planet', 'comet'],
        ...preferences
      };
      localStorage.setItem('emailPreferences', JSON.stringify(this.emailPreferences));
      return true;
    } catch (error) {
      console.error('保存邮件偏好设置失败:', error);
      return false;
    }
  }

  /**
   * 从本地存储加载邮件提醒偏好设置
   * @returns {Object} 偏好设置对象
   */
  loadEmailPreferences() {
    try {
      const saved = localStorage.getItem('emailPreferences');
      return saved ? JSON.parse(saved) : {
        enabled: false,
        reminderFrequency: 'daily',
        eventTypes: ['meteorShower', 'eclipse', 'planet', 'comet']
      };
    } catch (error) {
      console.error('加载邮件偏好设置失败:', error);
      return {
        enabled: false,
        reminderFrequency: 'daily',
        eventTypes: ['meteorShower', 'eclipse', 'planet', 'comet']
      };
    }
  }

  /**
   * 为天文事件设置邮件提醒
   * @param {Object} event 天文事件对象
   * @returns {Promise<Object>} 操作结果
   */
  async setEventEmailReminder(event) {
    // 检查是否已设置邮箱
    if (!this.userEmail) {
      return { success: false, error: '请先设置您的邮箱地址' };
    }

    // 检查是否启用了邮件提醒
    if (!this.emailPreferences.enabled) {
      return { success: false, error: '邮件提醒功能未启用' };
    }

    // 检查事件类型是否在用户的偏好设置中
    if (!this.emailPreferences.eventTypes.includes(event.type)) {
      return { success: false, error: '该类型事件不在您的邮件提醒偏好中' };
    }

    try {
      // 准备API请求数据
      const reminderData = {
        eventId: event.id,
        eventTitle: event.title,
        eventDate: event.date,
        eventType: event.type,
        eventDescription: event.description,
        email: this.userEmail,
        reminderFrequency: this.emailPreferences.reminderFrequency
      };

      // 这里应该发送API请求到后端
      // 由于前端环境限制，这里模拟API调用
      console.log('设置邮件提醒:', reminderData);
      
      // 模拟成功响应
      // 实际项目中，这里应该是：
      // const response = await fetch(`${this.apiBaseUrl}/set-reminder`, {
      //   method: 'POST',
      //   headers: {
      //     'Content-Type': 'application/json'
      //   },
      //   body: JSON.stringify(reminderData)
      // });
      // const result = await response.json();
      
      // 模拟结果
      const result = { success: true, reminderId: Date.now().toString() };
      
      // 保存本地记录
      this.saveEventReminderRecord(event.id);
      
      return result;
    } catch (error) {
      console.error('设置邮件提醒失败:', error);
      return { success: false, error: '设置邮件提醒失败，请稍后重试' };
    }
  }

  /**
   * 取消事件的邮件提醒
   * @param {string} eventId 事件ID
   * @returns {Promise<Object>} 操作结果
   */
  async cancelEventEmailReminder(eventId) {
    try {
      // 准备API请求数据
      const requestData = {
        eventId,
        email: this.userEmail
      };

      // 这里应该发送API请求到后端
      console.log('取消邮件提醒:', requestData);
      
      // 模拟成功响应
      // const response = await fetch(`${this.apiBaseUrl}/cancel-reminder`, {
      //   method: 'POST',
      //   headers: {
      //     'Content-Type': 'application/json'
      //   },
      //   body: JSON.stringify(requestData)
      // });
      // const result = await response.json();
      
      const result = { success: true };
      
      // 从本地记录中移除
      this.removeEventReminderRecord(eventId);
      
      return result;
    } catch (error) {
      console.error('取消邮件提醒失败:', error);
      return { success: false, error: '取消邮件提醒失败，请稍后重试' };
    }
  }

  /**
   * 保存事件提醒记录到本地
   * @param {string} eventId 事件ID
   */
  saveEventReminderRecord(eventId) {
    try {
      const records = this.getEventReminderRecords();
      if (!records.includes(eventId)) {
        records.push(eventId);
        localStorage.setItem('emailReminderEvents', JSON.stringify(records));
      }
    } catch (error) {
      console.error('保存提醒记录失败:', error);
    }
  }

  /**
   * 从本地记录中移除事件提醒
   * @param {string} eventId 事件ID
   */
  removeEventReminderRecord(eventId) {
    try {
      let records = this.getEventReminderRecords();
      records = records.filter(id => id !== eventId);
      localStorage.setItem('emailReminderEvents', JSON.stringify(records));
    } catch (error) {
      console.error('移除提醒记录失败:', error);
    }
  }

  /**
   * 获取所有已设置邮件提醒的事件ID
   * @returns {Array} 事件ID数组
   */
  getEventReminderRecords() {
    try {
      const saved = localStorage.getItem('emailReminderEvents');
      return saved ? JSON.parse(saved) : [];
    } catch (error) {
      console.error('获取提醒记录失败:', error);
      return [];
    }
  }

  /**
   * 检查事件是否已设置邮件提醒
   * @param {string} eventId 事件ID
   * @returns {boolean} 是否已设置提醒
   */
  hasEventReminder(eventId) {
    return this.getEventReminderRecords().includes(eventId);
  }

  /**
   * 生成事件提醒邮件内容
   * @param {Object} event 天文事件对象
   * @returns {string} 邮件HTML内容
   */
  generateEmailContent(event) {
    const eventDate = new Date(event.date).toLocaleString();
    
    return `
      <!DOCTYPE html>
      <html>
      <head>
        <meta charset="UTF-8">
        <title>天文事件提醒: ${event.title}</title>
        <style>
          body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px; }
          .header { background-color: #0a1128; color: white; padding: 20px; border-radius: 8px 8px 0 0; }
          .content { padding: 20px; background-color: white; border: 1px solid #ddd; border-radius: 0 0 8px 8px; }
          .event-title { color: #121e3e; }
          .event-date { color: #666; font-size: 18px; }
          .event-description { margin-top: 15px; }
          .footer { margin-top: 20px; font-size: 14px; color: #666; border-top: 1px solid #ddd; padding-top: 15px; }
          .action-button { display: inline-block; background-color: #4a6fa5; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px; margin-top: 15px; }
        </style>
      </head>
      <body>
        <div class="header">
          <h1>天文事件提醒</h1>
        </div>
        <div class="content">
          <h2 class="event-title">${event.title}</h2>
          <p class="event-date">发生时间: ${eventDate}</p>
          <div class="event-description">${event.description || '暂无描述'}</div>
          <a href="${window.location.origin}" class="action-button">查看详情</a>
        </div>
        <div class="footer">
          <p>这是一条自动发送的提醒邮件。</p>
          <p>若不想再收到此类提醒，请访问您的账户设置。</p>
        </div>
      </body>
      </html>
    `;
  }

  /**
   * 测试邮件发送（用于验证邮箱设置是否正确）
   * @returns {Promise<Object>} 操作结果
   */
  async testEmail() {
    if (!this.userEmail) {
      return { success: false, error: '请先设置您的邮箱地址' };
    }

    try {
      // 准备测试邮件数据
      const testData = {
        email: this.userEmail,
        subject: '天文观测助手 - 邮箱验证测试',
        content: '这是一封测试邮件，用于验证您的邮箱设置是否正确。如果您收到此邮件，说明设置成功！'
      };

      // 这里应该发送API请求到后端
      console.log('发送测试邮件:', testData);
      
      // 模拟成功响应
      const result = { success: true, message: '测试邮件已发送，请查收' };
      
      return result;
    } catch (error) {
      console.error('发送测试邮件失败:', error);
      return { success: false, error: '发送测试邮件失败，请稍后重试' };
    }
  }
}

// 导出单例实例
export default new EmailNotificationService();